package homework.exp04;

import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.Scanner;

/**
 * B类 - 使用递归方法实现的语法分析器
 * 根据题目规则检查Hedonian语言句子的语法正确性
 * 递归实现直接映射了题目中的语法规则
 */
public class B{
    // 输入扫描器，用于读取输入数据
    static Scanner cin = null;

    // 静态初始化块：尝试从文件读取输入，失败则使用标准输入
    static {
        try {
            cin = new Scanner(new FileReader(new File("F.in")));
        } catch (IOException e) {
            cin = new Scanner(System.in);
        }
    }

    // 当前处理的字符索引位置
    private static int currentIndex = 0;
    // 当前输入的句子
    private static String input;

    /**
     * 主方法：读取每一行输入并调用验证方法
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        // 逐行处理输入
        while (cin.hasNextLine()) {
            input = cin.nextLine().trim(); // 读取并去掉首尾空白字符
            currentIndex = 0; // 重置索引位置
            // 检查是否为有效句子且所有字符都已处理
            if (isValidSentence() && currentIndex == input.length()) {
                System.out.println("YES");
            } else {
                System.out.println("NO");
            }
        }
        cin.close();
    }

    /**
     * 递归方法：验证当前位置开始的子串是否构成有效句子
     * 直接实现了题目中的语法规则：
     * 1. p-z之间的字符是有效句子
     * 2. 如果s是有效句子，则Ns也是
     * 3. 如果s和t都是有效句子，则Cst、Dst、Est和Ist也是
     * @return 当前子串是否是有效句子
     */
    private static boolean isValidSentence() {
        // 检查是否到达输入末尾
        if (currentIndex >= input.length()) {
            return false;
        }
        
        // 获取当前字符并前进索引
        char currentChar = input.charAt(currentIndex);
        currentIndex++;
        
        // 规则1：p-z之间的字符是有效句子
        if (currentChar >= 'p' && currentChar <= 'z') {
            return true;
        }
        // 规则2：N后跟一个有效句子
        else if (currentChar == 'N') {
            return isValidSentence();
        }
        // 规则3：C、D、E、I后跟两个有效句子
        else if (currentChar == 'C' || currentChar == 'D' || currentChar == 'E' || currentChar == 'I') {
            return isValidSentence() && isValidSentence(); // 递归调用验证两个子句子
        }
        // 无效字符
        else {
            return false;
        }
    }
}